;void monocromatizarMax(char* red, char* green, char* blue, unsigned tam, char* matriz);
global monocromatizarMax
section .text
monocromatizarMax:
;stack frame
push ebp
mov ebp, esp
push ebx
push edi
push esi
mov esi, [ebp + 8] ; rojo
mov ebx, [ebp + 12] ; verde
mov edx, [ebp + 16] ; azul
mov ecx, [ebp + 20] ; tamaño de los arreglos (canales)
mov edi, [ebp + 24] ; matriz de salida
xor eax, eax
mov eax, 8 ;eax <- offset para moverse en los vectores
ciclo:
cmp ecx, 8 ;si me quedan menos de 8 los tengo q hacer aparte
jb prepararUltimos
movq mm0, [ebx] ; mm0 <- verdes
movq mm1, [esi] ; mm1 <- rojos
psubusb mm0, mm1 ; mm0 <- saturado_sin_signo(mm0-mm1) 
paddusb mm0, mm1 ; esta suma me deja el maximo entre los verdes y los rojos
movq mm2, [edx] ; mm2 <- azules
psubusb mm0, mm2 ;repito el procedimiento
paddusb mm0, mm2
movq [edi], mm0 ; guardo los maximos
;muevo los punteros y actualizo el contadores
add ebx, eax
add edx, eax
add esi, eax
add edi, eax
sub ecx, 7
loop ciclo
jmp fin
prepararUltimos:
cmp ecx, 0
je fin
xchg ebp, ebx ;hago este intercambio para poder usar bl (no tengo con ebp registro de 8)
ultimos:
xor eax, eax
xor ebx, ebx
;obtengo el maximo pero trabajando de a 1
mov bl, [esi]
mov al, [ebp]
inc esi
inc ebp
cmp al, bl
jb noEsAl
mov bl, [edx]
inc edx
cmp al, bl
jb esBl
esAl:
mov [edi], al
inc edi
loop ultimos
jmp fin
esBl:
mov [edi], bl
inc edi
loop ultimos
jmp fin
noEsAl:
mov al, [edx]
inc edx
cmp al, bl
jb esBl
jmp esAl

fin:
;desarmo el stack frame
pop esi
pop edi
pop ebx
pop ebp
ret